#!/usr/bin/env bash
debug=0
values=3
now=$(date +%d/%m/%Y)
tests=(

# Sem argumentos, mostra a data atual
''		''	''		t	$now

# Apelidos: hoje, ontem, ...
hoje		''	''		t	$now
today		''	''		t	$now
hoje		+	0		t	$now
today		+	0		t	$now
amanhã		-	1		t	$now
amanha		-	1		t	$now
tomorrow	-	1		t	$now
ontem		+	1		t	$now
yesterday	+	1		t	$now
anteontem	+	2		t	$now
hoje		+	0d		t	$now
amanhã		-	1d		t	$now
ontem		+	1d		t	$now
anteontem	+	2d		t	$now

# Um delta sozinho é aplicado à data atual
0d		''	''		t	$now
0m		''	''		t	$now
0a		''	''		t	$now

# Se há um delta, o outro valor deve ser uma data ou número
1d		+	1m		r	^Uso:.*
1a		+	1m		r	^Uso:.*
1m		+	0a		r	^Uso:.*

# Cálculo com zero 
22/12/1999	+	0		t	22/12/1999
22/12/1999	-	0		t	22/12/1999

# Cálculos estranhos
0		+	0		t	01/01/1970
1		-	1		t	01/01/1970
1		+	0		t	02/01/1970
0		+	1		t	02/01/1970
0		-	1		t	31/12/1969

# Anos com 2, 3, 5 dígitos
01/01/1		+	0		t	01/01/1
01/01/10	+	0		t	01/01/10
01/01/100	+	0		t	01/01/100
01/01/1000	+	0		t	01/01/1000
01/01/10000	+	0		t	"Data inválida '01/01/10000', deve ser dd/mm/aaaa"

# Anos com zeros à esquerda (pode confundir com octal)
01/01/0008	+	0		t	01/01/8
01/01/008	+	0		t	01/01/8
01/01/08	+	0		t	01/01/8
01/01/08	+	1d		t	02/01/8
01/01/08	+	1m		t	01/02/8
01/01/08	+	1a		t	01/01/9

# Erros
hoje		/	2		t	"Operação inválida '/'. Deve ser + ou -."
hoje		1	2		t	"Operação inválida '1'. Deve ser + ou -."
#
foo		''	''		t	"Data inválida 'foo', deve ser dd/mm/aaaa"
foo		+	1		t	"Data inválida 'foo', deve ser dd/mm/aaaa"
1		+	foo		t	"Data inválida 'foo', deve ser dd/mm/aaaa"
01/01/1970	+	foo		t	"Data inválida 'foo', deve ser dd/mm/aaaa"
1d		+	foo		t	"Data inválida 'foo', deve ser dd/mm/aaaa"
#
99/99/9999	''	''		t	"Data inválida '99/99/9999', deve ser dd/mm/aaaa"
99/99/9999	+	1		t	"Data inválida '99/99/9999', deve ser dd/mm/aaaa"
1		+	99/99/9999	t	"Data inválida '99/99/9999', deve ser dd/mm/aaaa"
#
77.0		''	''		t	"Número inválido '77.0'"
-77.0		''	''		t	"Número inválido '-77.0'"
77,0		''	''		t	"Número inválido '77,0'"
-77,0		''	''		t	"Número inválido '-77,0'"
01/01/1970	+	5x		t	"Número inválido '5x'"
5x		+	01/01/1970	t	"Número inválido '5x'"
01/01/1970	+	-5d		t	"Número inválido '-5d'"
-5d		+	01/01/1970	t	"Número inválido '-5d'"
#
01/01/1970	+	5.5d		t	"Delta inválido '5.5d'. Deve ser algo como 5d, 5m ou 5a."
01/01/1970	+	5,5d		t	"Delta inválido '5,5d'. Deve ser algo como 5d, 5m ou 5a."
5.5d		+	01/01/1970	t	"Delta inválido '5.5d'. Deve ser algo como 5d, 5m ou 5a."
5,5d		+	01/01/1970	t	"Delta inválido '5,5d'. Deve ser algo como 5d, 5m ou 5a."
#
01/01/1970	-	''		r	^Uso:.*
01/01/1970	+	''		r	^Uso:.*
hoje		+	''		r	^Uso:.*
today		+	''		r	^Uso:.*
111		+	''		r	^Uso:.*
1m		+	''		r	^Uso:.*
-		01/01/1970	''	r	^Uso:.*
+		01/01/1970	''	r	^Uso:.*
+		hoje		''	r	^Uso:.*
+		today		''	r	^Uso:.*
+		111		''	r	^Uso:.*
+		1m		''	r	^Uso:.*

# Exemplos do --help
22/12/1999	+	69		t	29/02/2000	# 29 de Fevereiro
01/03/2000	-	69		t	23/12/1999
01/03/2000	-	11/11/1999	t	111

# Checagem de ano bissexto
29/02/2000	''	''	t	11016
1	+	29/02/2000	t	01/03/2000
29/02/2001	''	''	t	"Data inválida '29/02/2001', pois 2001 não é um ano bissexto"
1	 + 	29/02/2001	t	"Data inválida '29/02/2001', pois 2001 não é um ano bissexto"

# Troca de 29/02 pra 28/02 quando o resultado do delta não é bissexto
29/02/2000	+	1a	t	28/02/2001
29/02/2000	+	4a	t	29/02/2004

# delta
01/01/2000 + 0		t	01/01/2000
01/01/2000 + 0d		t	01/01/2000
01/01/2000 + 0m		t	01/01/2000
01/01/2000 + 0a		t	01/01/2000
01/01/2000 + 1		t	02/01/2000
01/01/2000 + 1d		t	02/01/2000
01/01/2000 + 1m		t	01/02/2000
01/01/2000 + 1a		t	01/01/2001
01/01/2000 + 10		t	11/01/2000
01/01/2000 + 10d	t	11/01/2000
01/01/2000 + 10m	t	01/11/2000
01/01/2000 + 10a	t	01/01/2010
01/01/2000 + 100	t	10/04/2000
01/01/2000 + 100d	t	10/04/2000
01/01/2000 + 100m	t	01/05/2008
01/01/2000 + 100a	t	01/01/2100
01/01/2000 - 1		t	31/12/1999
01/01/2000 - 1d		t	31/12/1999
01/01/2000 - 1m		t	01/12/1999
01/01/2000 - 1a		t	01/01/1999
01/01/2000 - 10		t	22/12/1999
01/01/2000 - 10d	t	22/12/1999
01/01/2000 - 10m	t	01/03/1999
01/01/2000 - 10a	t	01/01/1990
01/01/2000 - 100	t	23/09/1999
01/01/2000 - 100d	t	23/09/1999
01/01/2000 - 100m	t	01/09/1991
01/01/2000 - 100a	t	01/01/1900
# delta negativo, porém com resultado positivo (não muda o ano)
01/10/2000 - 5m		t	01/05/2000

# Delta com números
0	+	1d	t	02/01/1970
1	+	1d	t	03/01/1970
1	+	1m	t	02/02/1970
1	+	1a	t	02/01/1971
1d	+	0	t	02/01/1970
1d	+	1	t	03/01/1970
1m	+	1	t	02/02/1970
1a	+	1	t	02/01/1971

# Limites do Epoch
30/12/1968	''	''	t	-367
31/12/1968	''	''	t	-366
01/01/1969	''	''	t	-365
02/01/1969	''	''	t	-364
30/12/1969	''	''	t	-2
31/12/1969	''	''	t	-1
01/01/1970	''	''	t	0
02/01/1970	''	''	t	1
03/01/1970	''	''	t	2
31/12/1970	''	''	t	364
01/01/1971	''	''	t	365
02/01/1971	''	''	t	366
-367		''	''	t	30/12/1968
-366		''	''	t	31/12/1968
-365		''	''	t	01/01/1969
-364		''	''	t	02/01/1969
-2		''	''	t	30/12/1969
-1		''	''	t	31/12/1969
0		''	''	t	01/01/1970
1		''	''	t	02/01/1970
2		''	''	t	03/01/1970
364		''	''	t	31/12/1970
365		''	''	t	01/01/1971
366		''	''	t	02/01/1971

# Bissexto antes de Epoch
-673		''	''	t	28/02/1968
-672		''	''	t	29/02/1968
-671		''	''	t	01/03/1968
28/02/1968	''	''	t	-673
29/02/1968	''	''	t	-672
01/03/1968	''	''	t	-671

# Bissexto depois de Epoch
788		''	''	t	28/02/1972
789		''	''	t	29/02/1972
790		''	''	t	01/03/1972
28/02/1972	''	''	t	788
29/02/1972	''	''	t	789
01/03/1972	''	''	t	790

# Data -> Numero
01/01/1970	''	''	t	0
28/02/1970	''	''	t	58
01/03/1970	''	''	t	59
31/12/1970	''	''	t	364
01/01/1971	''	''	t	365
28/02/1972	''	''	t	788
29/02/1972	''	''	t	789
01/03/1972	''	''	t	790
31/12/1972	''	''	t	1095
01/01/1973	''	''	t	1096
28/02/1973	''	''	t	1154
01/03/1973	''	''	t	1155
28/02/1976	''	''	t	2249
29/02/1976	''	''	t	2250
31/12/1976	''	''	t	2556
01/01/1977	''	''	t	2557
01/01/1980	''	''	t	3652
02/01/1980	''	''	t	3653
28/02/1980	''	''	t	3710
29/02/1980	''	''	t	3711
01/03/1980	''	''	t	3712
31/12/1980	''	''	t	4017
01/01/1981	''	''	t	4018
02/01/1981	''	''	t	4019
28/02/1981	''	''	t	4076
01/03/1981	''	''	t	4077
31/12/1981	''	''	t	4382
01/01/1982	''	''	t	4383
02/01/1982	''	''	t	4384
10/09/1983	''	''	t	5000
31/12/1983	''	''	t	5112
01/01/1984	''	''	t	5113
02/01/1984	''	''	t	5114
28/02/1984	''	''	t	5171
29/02/1984	''	''	t	5172
01/03/1984	''	''	t	5173
31/12/1984	''	''	t	5478
01/01/1985	''	''	t	5479
02/01/1985	''	''	t	5480
28/02/1985	''	''	t	5537
01/03/1985	''	''	t	5538
31/12/1985	''	''	t	5843
01/01/1986	''	''	t	5844
02/01/1986	''	''	t	5845
31/12/1986	''	''	t	6208
01/01/1987	''	''	t	6209
02/01/1987	''	''	t	6210
31/12/1987	''	''	t	6573
01/01/1988	''	''	t	6574
02/01/1988	''	''	t	6575
31/12/1988	''	''	t	6939
01/01/1989	''	''	t	6940
02/01/1989	''	''	t	6941
31/12/1989	''	''	t	7304
01/01/1990	''	''	t	7305
02/01/1990	''	''	t	7306
27/11/1991	''	''	t	8000
23/08/1994	''	''	t	9000
19/05/1997	''	''	t	10000
13/02/2000	''	''	t	11000
29/01/2003	''	''	t	12081

# Numero -> Data
0	''	''	t	01/01/1970
58	''	''	t	28/02/1970
59	''	''	t	01/03/1970
364	''	''	t	31/12/1970
365	''	''	t	01/01/1971
788	''	''	t	28/02/1972
789	''	''	t	29/02/1972
790	''	''	t	01/03/1972
1095	''	''	t	31/12/1972
1096	''	''	t	01/01/1973
1154	''	''	t	28/02/1973
1155	''	''	t	01/03/1973
2249	''	''	t	28/02/1976
2250	''	''	t	29/02/1976
2556	''	''	t	31/12/1976
2557	''	''	t	01/01/1977
3652	''	''	t	01/01/1980
3653	''	''	t	02/01/1980
3710	''	''	t	28/02/1980
3711	''	''	t	29/02/1980
3712	''	''	t	01/03/1980
4017	''	''	t	31/12/1980
4018	''	''	t	01/01/1981
4019	''	''	t	02/01/1981
4076	''	''	t	28/02/1981
4077	''	''	t	01/03/1981
4382	''	''	t	31/12/1981
4383	''	''	t	01/01/1982
4384	''	''	t	02/01/1982
5000	''	''	t	10/09/1983
5112	''	''	t	31/12/1983
5113	''	''	t	01/01/1984
5114	''	''	t	02/01/1984
5171	''	''	t	28/02/1984
5172	''	''	t	29/02/1984
5173	''	''	t	01/03/1984
5478	''	''	t	31/12/1984
5479	''	''	t	01/01/1985
5480	''	''	t	02/01/1985
5537	''	''	t	28/02/1985
5538	''	''	t	01/03/1985
5843	''	''	t	31/12/1985
5844	''	''	t	01/01/1986
5845	''	''	t	02/01/1986
6208	''	''	t	31/12/1986
6209	''	''	t	01/01/1987
6210	''	''	t	02/01/1987
6573	''	''	t	31/12/1987
6574	''	''	t	01/01/1988
6575	''	''	t	02/01/1988
6939	''	''	t	31/12/1988
6940	''	''	t	01/01/1989
6941	''	''	t	02/01/1989
7304	''	''	t	31/12/1989
7305	''	''	t	01/01/1990
7306	''	''	t	02/01/1990
8000	''	''	t	27/11/1991
9000	''	''	t	23/08/1994
10000	''	''	t	19/05/1997
11000	''	''	t	13/02/2000
12081	''	''	t	29/01/2003
)
. _lib
